# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import Selector
from scrapy.http import Request     # 引入请求类
from xiaohua_spider.items import XiaohuaSpiderItem


class XiaohuaSpider(scrapy.Spider):
    name = 'xiaohua'
    allowed_domains = ['xiaohuar.com']
    start_urls = ['http://www.xiaohuar.com/hua/']

    # 自定义头部， 可以在下面代码中载入设置或写在setting.py中
    custom_settings = {
        'DEFAULT_REQUEST_HEADERS': {
            # 非必须写入
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language': 'en',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
        }
    }

    # 存放带爬取url，scrapy会自动去重和重试失败链接，我们只需要考虑往url集合中添加为爬取的url。
    url_set = set()

    def parse(self, response):
        """
        请求首页图集列表之后得到列表页，解析获取图集详情页地址
        """
        # 首先重写parse,否则父类会报NotImplement异常
        # response.xpath()。如果安装或lsml,scrapy默认用lsml.etree。etree.HTML(resp.content)
        a_list = Selector(response).xpath('//div[@class="img"]/a')
        for a in a_list:
            detail_url = a.xpath('.//@href').extract_first()
            if detail_url in self.url_set:
                # 已爬取过
                pass
            else:
                # 添加到爬取链接池
                self.url_set.add(detail_url)
                # 发现画廊页url http://www.xiaohuar.com/s-1-1998.html,和详情页http://www.xiaohuar.com/p-1-1998.html 路由存在规律，可以直接转换，节省一次requests请求和xpath解析
                gallery_url = detail_url.replace('/p', '/s')
                # yield 相当于同步函数里的返回值(return返回值)
                # callback 相当于方法嵌套使用(函数调用)
                # 只不过这两个关键字表现异步处理过程。yield生成请求对象(还没有发送请求)到队列中，框架从队列中取一个请求对象取请求，得到响应后再交给回调函数处理。
                yield Request(url=gallery_url, callback=self.img_parse)

    def img_parse(self, response):
        """解析请求画廊页后的html结果，生成item"""
        src_list = Selector(response).xpath('//div[@class="inner"]/a/@href').extract()  # ['https:xxx.jpg...','...']
        folder_name = Selector(response).xpath('//h1/text()').extract_first()
        # 由于网站开发技术历史原因，有路由形式访问的 '/d/file/20181216/small6ef7993ed1b6ce4f31d4b60f73c066571544975727.jpg'
        # 也有访问静态服务器接口形式的 'https://www.dxsabc.com/api/xiaohua/upload/min_img/20190110/20190110DMt7SdoZtk.jpg'
        for src in src_list:
            if src[:2] == '/d':
                img_url = 'http://www.xiaohuar.com' + src
                print('图片资源', img_url)  # self.log('图片资源', src)
            else:
                img_url = src

            img_name = img_url.split('/')[-1]

            item = XiaohuaSpiderItem(folder_name=folder_name, img_name=img_name, img_url=img_url)
            yield item







